TIP Sample App/PipelineCacheInspectionResultsViewController.m (81 lines of code) (raw):

// // PipelineCacheInspectionResultsViewController.m // TwitterImagePipeline // // Created on 2/21/17. // Copyright © 2020 Twitter. All rights reserved. // #import <TwitterImagePipeline/TwitterImagePipeline.h> #import "PipelineCacheInspectionResultsViewController.h" @interface PipelineCacheInspectionResultsViewController () <UITableViewDelegate, UITableViewDataSource> { NSMutableArray<id<TIPImagePipelineInspectionResultEntry>> *_results; TIPImagePipeline *_pipeline; UITableView *_tableView; } @end @implementation PipelineCacheInspectionResultsViewController - (instancetype)initWithResults:(NSArray<id<TIPImagePipelineInspectionResultEntry>> *)results pipeline:(TIPImagePipeline *)pipeline { if (self = [self init]) { _pipeline = pipeline; _results = [results mutableCopy]; } return self; } - (void)viewDidLoad { [super viewDidLoad]; _tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain]; _tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; _tableView.delegate = self; _tableView.dataSource = self; [self.view addSubview:_tableView]; } #pragma mark Table View - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; } - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return (NSInteger)_results.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"EntryCell"]; if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"EntryCell"]; cell.textLabel.numberOfLines = 3; cell.textLabel.lineBreakMode = NSLineBreakByTruncatingHead; } id<TIPImagePipelineInspectionResultEntry> entry = _results[(NSUInteger)indexPath.row]; cell.imageView.image = entry.image; cell.imageView.contentMode = UIViewContentModeScaleAspectFit; if (entry.progress < 1.f) { cell.textLabel.text = [NSString stringWithFormat:@"(%tu%%) %@\n%@\n%@", (NSUInteger)(entry.progress * 100.f), [NSByteCountFormatter stringFromByteCount:(long long)entry.bytesUsed countStyle:NSByteCountFormatterCountStyleBinary], NSStringFromCGSize(entry.dimensions), entry.identifier]; } else { cell.textLabel.text = [NSString stringWithFormat:@"%@\n%@\n%@", [NSByteCountFormatter stringFromByteCount:(long long)entry.bytesUsed countStyle:NSByteCountFormatterCountStyleBinary], NSStringFromCGSize(entry.dimensions), entry.identifier]; } return cell; } - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 100; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { [tableView deselectRowAtIndexPath:indexPath animated:YES]; const NSUInteger index = (NSUInteger)indexPath.row; id<TIPImagePipelineInspectionResultEntry> entry = _results[index]; UIAlertController *alertVC = [UIAlertController alertControllerWithTitle:@"Clear entry?" message:entry.identifier preferredStyle:UIAlertControllerStyleActionSheet]; [alertVC addAction:[UIAlertAction actionWithTitle:@"Clear" style:UIAlertActionStyleDestructive handler:^(UIAlertAction *action) { [self _private_clearEntryAtIndexPath:indexPath]; }]]; [alertVC addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:NULL]]; [self presentViewController:alertVC animated:YES completion:NULL]; } #pragma mark Private - (void)_private_clearEntryAtIndexPath:(NSIndexPath *)indexPath { const NSUInteger index = (NSUInteger)indexPath.row; _didClearAnyEntries = YES; id<TIPImagePipelineInspectionResultEntry> entry = _results[index]; [_pipeline clearImageWithIdentifier:entry.identifier]; [_results removeObjectAtIndex:index]; [_tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; } @end